前言

跨区域跨网段进行网络通信依赖于IP地址,早年设定的IPv4地址未考虑到未来的联网设备数目庞大,在19世纪90年代人们就开始为了解决IPv4地址耗尽的问题提出了许多解决方案。

在整体的互联网上也是需要避免IP冲突的,因此IP地址是有限的。

1996年,互联网标准组织IETF(Internet Engineering Task Force)为了配合缓解IPv4地址耗尽的问题,在RFC1918文档中定义了专门用于私有网络的IP地址范围。

被定义的私有IP地址范围:

  • 10.0.0.0 到 10.255.255.255 (10/8 前缀)
  • 172.16.0.0 到 172.31.255.255 (172.16/12 前缀)
  • 192.168.0.0 到 192.168.255.255 (192.168/16 前缀)

允许组织内部使用这些地址,而不需要为每个内部设备申请公网IP,这在一定程度上减少了对公网IP地址的需求,尽管效果有限。

在RFC 1918发布之前,许多组织已经在使用非注册的IP地址进行内部网络构建。

RFC 1918是在私网概念已经存在的基础上,对其进行了规范化和标准化。

这个文档的重要性不在于引入新概念,而在于为已有的实践提供了全球认可的标准,从而大大促进了私网的有效使用和互联网的整体发展,为后续的NAT技术应用奠定基础。

值得注意的是NAT的概念在1994年就已经提出(RFC 1631),当私网地址和NAT技术结合使用时,才真正开始有效地缓解IPv4地址耗尽的问题。

NAT介绍

网络地址转换NAT(Network Address Translation)是将IP数据报文头中的IP地址转换为另一个IP地址的过程。

NAT主要用于实现内部网络(简称内网/私网,使用私有IP地址)访问外部网络(简称外网/公网,使用公有IP地址)的功能。

当私网的主机要访问外网时,通过NAT技术可以将其私网地址转换为公网地址;

实现多个私网用户共用一个公网地址来访问外部网络,这样既可保证网络互通,又节省了公网地址。

NAT技术按照原理可以分为两类:

  1. 基础NAT:传统的将IP数据报文中的IP地址转换为另一个IP地址,只能实现一个私网IP地址映射到一个公网IP地址。
  2. NAPT:增加了对TCP/UDP报文端口的转换,可以实现多个私网IP地址映射到同一个公网IP地址上。

NAT技术按照实现方式可以分为两类:

  1. 静态NAT:在配置时静态绑定一个IP地址/端口到另一个IP地址/端口。
  2. 动态NAT:类似于DHCP,在内部主机访问外部网络时,NAT自动分配IP/端口用于转换。

基本NAT

以图示拓扑为例子,R1配置了NAT,当PC1要访问服务器时:

  1. 其发送的报文内[ 源地址:192.168.1.1:X 目的地址:1.1.1.1:80 ]
  2. 路由器收到该报文,检查源地址与自身配置的NAT转换信息,假设确认要进行转换;
  3. 路由器转发该报文时,修改报文[ 源地址:1.1.1.2:X 目的地址:1.1.1.1:80 ]

当服务器收到报文,进行回复:

  1. 服务器根据收到报文的源目地址信息,回的报文[ 源地址:1.1.1.1:80 目的地址:1.1.1.2:X ]
  2. 路由器收到该报文,检查源地址与NAT信息,确定要进行转换;
  3. 路由器转发该报文时,修改报文[ 源地址:1.1.1.1:80 目的地址:192.168.1.1:X ]

IP地址后为端口号,这里的X表示PC1随机使用的一个端口号。

对于PC来说,其视角是它一直是在与服务器进行通信。

对于服务器来说,其视角是它一直在与1.1.1.2进行通信(也就是路由器)。

NAPT

以图示拓扑为例子,R1配置了NAT,当PC1要访问服务器时:

  1. 其发送的报文内[ 源地址:192.168.1.1:X 目的地址:1.1.1.1:80 ]
  2. 路由器收到该报文,检查源地址与自身配置的NAT转换信息,假设确认要进行转换;
  3. 路由器转发该报文时,修改报文[ 源地址:1.1.1.2:Y 目的地址:1.1.1.1:80 ]

当服务器收到报文,进行回复:

  1. 服务器根据收到报文的源目地址信息,回的报文[ 源地址:1.1.1.1:80 目的地址:1.1.1.2:Y ]
  2. 路由器收到该报文,检查源地址与NAT信息,确定要进行转换;
  3. 路由器转发该报文时,修改报文[ 源地址:1.1.1.1:80 目的地址:192.168.1.1:X]

IP地址后为端口号,Y表示路由器上随机使用的端口号,注意Y与X不需要相等。

在此基础上,可以出现PC2、PC3,路由器都可以给它们转换成1.1.1.2,只是使用的端口换成其他不冲突的端口号。

配置

静态NAT配置

  1. 执行命令system-view,进入系统视图。

  2. 执行命令interface interface-type interface-number,进入与外网互联的接口视图。

  3. 根据情况选择使用那种类型的NAT方案:

    • 执行命令nat static global global-address inside host-address [ acl acl-number ] [ description description ],配置基本NAT映射关系,可选ACL匹配原则与自定义描述。

    • nat static protocol { tcp | udp } global global-address global-port inside host-address [ host-port ] [ acl acl-number ] [ description description ],配置NAPT映射关系,可选ACL匹配原则与自定义描述。

动态NAT配置

  1. 执行命令system-view,进入系统视图。

  2. 创建一个基本/高级ACL,用于匹配要进行地址转换的私网主机报文。

  3. 配置出接口的地址关联,用户根据实际情况选择其中一种配置方法。

    • 配置带地址池的NAT Outbound:

      1. 执行命令nat address-group group-index start-address end-address,配置公网地址池。

      2. 执行命令interface interface-type interface-number ,进入与外网互联的接口视图。

      3. 执行命令nat outbound acl-number address-group group-index [ no-pat ],配置让匹配中ACL规则的报文,按照地址池空闲IP地址进行NAT/NAPT转换。

        默认为NAPT模式,如果公网地址充足,可加配参数no-pat配置为基本NAT模式。

    • 配置不带地址池的Easy IP:

      1. 执行命令interface interface-type interface-number,进入与外网互联的接口视图。
      2. 执行命令nat outbound acl-number,配置让匹配中ACL规则的报文,按照该接口IP地址进行NAPT转换。

案例

静态NAT

如图所示,企业内部使用192.168.1.0 /24网段进行内部通信,企业内部存在一服务器S1,ip为192.168.1.250。

当前假设企业网络的出接口ip为12.1.1.1,对端的运营商ip为12.1.1.2;

同时企业向运营商额外申请了一个公网ip:12.1.1.3,计划用做服务器的公网ip。

R1的左侧为g0/0/0接口,右侧为g0/0/1接口。

在R1上进行基础配置:

1
2
3
4
5
6
7
8
9
10
11
<Huawei>system-view 
[Huawei]sysname magiku
#配置接口IP
[magiku]interface g0/0/0
[magiku-GigabitEthernet0/0/0]ip address 192.168.1.254 24
[magiku-GigabitEthernet0/0/0]q
[magiku]interface g0/0/1
[magiku-GigabitEthernet0/0/1]ip address 12.1.1.1 24
[magiku-GigabitEthernet0/0/1]q
#配置指向对端运营商的默认路由
[magiku]ip route-static 0.0.0.0 0.0.0.0 12.1.1.2

在R1上配置静态NAT,绑定空闲的公网ip:12.1.1.3对应私网服务器的ip:192.168.1.250

1
2
3
[magiku]interface g0/0/1
[magiku-GigabitEthernet0/0/1]nat static global 12.1.1.3 inside 192.168.1.250
[magiku-GigabitEthernet0/0/1]q

这时我们在R2上ping12.1.1.3就能发现通信:

1
2
3
4
5
6
7
8
9
10
11
12
13
[R2]ping 12.1.1.3
PING 12.1.1.3: 56 data bytes, press CTRL_C to break
Reply from 12.1.1.3: bytes=56 Sequence=1 ttl=254 time=10 ms
Reply from 12.1.1.3: bytes=56 Sequence=2 ttl=254 time=10 ms
Reply from 12.1.1.3: bytes=56 Sequence=3 ttl=254 time=10 ms
Reply from 12.1.1.3: bytes=56 Sequence=4 ttl=254 time=10 ms
Reply from 12.1.1.3: bytes=56 Sequence=5 ttl=254 time=30 ms

--- 12.1.1.3 ping statistics ---
5 packet(s) transmitted
5 packet(s) received
0.00% packet loss
round-trip min/avg/max = 10/14/30 ms

动态NAPT

继续使用前面静态案例的拓扑,R1的基础配置就不重复了。

现在假设企业额外购买了两个个公网IP:12.1.1.4与12.1.1.5,打算用作其他内网主机访问外网用的公网ip。

1
2
3
4
5
6
7
8
9
10
#创建基本acl匹配所有主机
[magiku]acl 2000
[magiku-acl-basic-2000]rule permit source any
[magiku-acl-basic-2000]q
#创建nat地址池
[magiku]nat address-group 1 12.1.1.4 12.1.1.5
#在出接口启用匹配acl2000的报文安装nat地址池进行NAPT转换
[magiku]interface g0/0/1
[magiku-GigabitEthernet0/0/1]nat outbound 2000 address-group 1
[magiku-GigabitEthernet0/0/1]q

配置完后,使用PC1进行测试,可以发现能够访问运营商,使用的12.1.1.4的公网ip。

注意事项

使用静态NAT/NAPT的话,外网才可以主动访问内网主机。

使用动态模式的话,因为存在路由器动态创建生成映射的过程,所以外网不可以主动访问内网主机。